#include "tramsPage.h"
#include "roadsPage.h"
#include "roundaboutPages.h"
#include "mainOptions.h"
#include <QGroupBox>
#include <QVBoxLayout>
#include <QGridLayout>
#include <QLabel>
#include <QSlider>
#include <QSpinBox>
#include <QTextCodec>
#include <QCheckBox>
#include <QComboBox>
#include <QDebug>
#include <QSettings>
#include <QPushButton>


//----------------------zakladka TRAMWAJE----------------------------------
TramsPage::TramsPage(Options *parent)
    : QWidget(parent)
{
    QTextCodec::setCodecForTr (QTextCodec::codecForName ("UTF-8"));

    myParent = (parent);

    _mainLayout = new QVBoxLayout;
    _toryLayout = new QGridLayout();
    //tworze niezmienne widgety (nagłówki)

    _zrodloLabel = new QLabel(tr("Źródło"));
    _podlozeZrodloLabel  = new QLabel(tr("Podłoże"));
    _celLabel  = new QLabel(tr("Cel"));
    _podlozeCelLabel  = new QLabel(tr("Podłoże"));

    _toryLayout->addWidget(_zrodloLabel, 0, 1, Qt::AlignCenter);
    _toryLayout->addWidget(_podlozeZrodloLabel, 0, 2, Qt::AlignCenter);
    _toryLayout->addWidget(_celLabel, 0, 3, Qt::AlignCenter);
    _toryLayout->addWidget(_podlozeCelLabel, 0, 4, Qt::AlignCenter);

    createNumRailsWidgets();

    _mainLayout->addLayout(_iloscTorowLayout);//layout z iloscia torow
    _mainLayout->addSpacing(12);
    _mainLayout->addLayout(_toryLayout);//layout z torami
    _mainLayout->addStretch(1);
    setLayout(_mainLayout);
}


void TramsPage::createNumRailsWidgets()
{
    _iloscTorowLayout = new QHBoxLayout();
    _iloscTorowLabel = new QLabel(tr("Ilość torowisk"));
    _iloscTorowSpinBox = new QSpinBox();
    _iloscTorowSlider = new QSlider(Qt::Horizontal); //To jest numRails

    connect(_iloscTorowSlider, SIGNAL(valueChanged(int)), _iloscTorowSpinBox, SLOT(setValue(int)));
    connect(_iloscTorowSpinBox, SIGNAL(valueChanged(int)), _iloscTorowSlider, SLOT(setValue(int)));

    connect(_iloscTorowSpinBox, SIGNAL(valueChanged(int)), this, SLOT(changeNumRails(int)));

    _iloscTorowSpinBox->setRange(0,10);
    _iloscTorowSlider->setRange(0,10);

    _iloscTorowLayout->addWidget(_iloscTorowLabel);
    _iloscTorowLayout->addWidget(_iloscTorowSpinBox);
    _iloscTorowLayout->addWidget(_iloscTorowSlider);
}

void TramsPage::createRailsProperties(int numRails)
{
    //tworzę kolejne linie z właściwościami gałęzi (w zależności od numRails)
    for (int i = 0; i < numRails; i++)
    {
       _torLabel.append( new QLabel(tr("Tor ")+QString::number(double(i))) );
       _numerZrodlaComboBox.append( new QComboBox() );
       _podlozeZrodlaComboBox.append( new QComboBox());
       _numerCeluComboBox.append( new QComboBox() );
       _podlozeCeluComboBox.append( new QComboBox() );

           _toryLayout->addWidget(_torLabel.at(i), i+3, 0, Qt::AlignCenter);
           _toryLayout->addWidget(_numerZrodlaComboBox[i], i+3, 1, Qt::AlignCenter);
           _toryLayout->addWidget(_podlozeZrodlaComboBox[i], i+3, 2, Qt::AlignCenter);
           _toryLayout->addWidget(_numerCeluComboBox[i], i+3, 3, Qt::AlignCenter);
           _toryLayout->addWidget(_podlozeCeluComboBox[i], i+3, 4, Qt::AlignCenter);

        connect(_numerZrodlaComboBox[i], SIGNAL(currentIndexChanged(int)), this, SLOT(groundChanged(int)));
    }
    configureTramPage();
}

void TramsPage::configureTramPage()
{
    for (int i = 0; i < _iloscTorowSpinBox->value(); i++)
    {
       _podlozeZrodlaComboBox[i]->addItem(tr("Trawa"));
       _podlozeZrodlaComboBox[i]->addItem(tr("Jezdnia"));
       _podlozeCeluComboBox[i]->addItem(tr("Trawa"));
       _podlozeCeluComboBox[i]->addItem(tr("Jezdnia"));
        setTrackNumber(i);
   }
}

void TramsPage::numBranchesChanged(int numBranches)//slot odbierający sygnał, że zmieniła się ilość NumBranches
{
    //zmieniam numer źródła i celu
    int index = 0;
    if (_numBranches > numBranches) //jesli ilosc galezi sie zmniejszyla to usuwam te wartości w ComboBoxach, które są większe niż nowa wartość
    {
        for (int i = 0; i < _iloscTorowSpinBox->value(); i++)
            for (int staraWartosc = _numBranches-1; staraWartosc >= numBranches ; staraWartosc--)
            {
                index = _numerZrodlaComboBox[i]->findText(QString::number(double(staraWartosc)));
                if (index != -1)
                    _numerZrodlaComboBox[i]->removeItem(index);
                else //czy jest możliwe żeby starej wartości nie było ani na wjeździe ani na zjeździe? Nie ma takiej ożliwości
                {
                    index = _numerCeluComboBox[i]->findText(QString::number(double(staraWartosc)));
                    _numerCeluComboBox[i]->removeItem(index);
                }
            }
    }
    else //jesli ilosc galezi sie zwiększyła to dodaje "brakujace" indexy
    {
        for (int i = 0; i < _iloscTorowSpinBox->value(); i++)
        {
            for (int j = _numBranches; j < numBranches ; j++)  //dopoki stara wartość jest mniejsza od nowej. numBranches to argument. _numBranches to zmienna klasowa
            {
                if (myParent->getBranchDirection(j) == entry)
                {
                    _numerZrodlaComboBox[i]->addItem(QString::number(double(j)));
                }
                else
                {
                    _numerCeluComboBox[i]->addItem(QString::number(double(j)));
                }
            }
        }
    }
    _numBranches = numBranches;
}

void TramsPage::changeNumRails(int newNumRails)
{
    //1. usunięcie właściwości wszystkich gałęzi
    deleteRailsProperties();
    //2. ustawienie właściwości nowej liczby gałęzi
    createRailsProperties(newNumRails);
//    qDebug()<<"nowa wartość num Rails"<<_iloscTorowSpinBox->value();
}

void TramsPage::deleteRailsProperties()
{
    foreach (QLabel * q, _torLabel)
        delete q;
    foreach (QComboBox * q, _numerZrodlaComboBox)
        delete q;
    foreach (QComboBox * q, _podlozeZrodlaComboBox)
        delete q;
    foreach (QComboBox * q, _numerCeluComboBox)
        delete q;
    foreach (QComboBox * q, _podlozeCeluComboBox)
        delete q;

    _torLabel.clear();
    _numerZrodlaComboBox.clear();
    _podlozeZrodlaComboBox.clear();
    _numerCeluComboBox.clear();
    _podlozeCeluComboBox.clear();
}

void TramsPage::saveTramsSettings()
{
    QSettings o("TabMar", "RoundaboutSimulator");
    //gałąź
    removeGroupSettings("Rails");
    o.beginWriteArray("Rails");
    for (int i = 0; i < _iloscTorowSpinBox->value(); i++)
    {
            o.setArrayIndex(i);
            o.setValue("from", _numerZrodlaComboBox[i]->currentText().toInt() );
            o.setValue("to",  _numerCeluComboBox[i]->currentText().toInt() );
            o.setValue("fromRailBed", indexToRailBed(_podlozeZrodlaComboBox[i]) );
            o.setValue("toRailBed", indexToRailBed(_podlozeCeluComboBox[i]) );
    }
    o.endArray();
}

void TramsPage::readTramsSettings()
{
    QSettings o("TabMar", "RoundaboutSimulator");
    //gałąź
    _iloscTorowSpinBox->setValue( o.value("numRails", 0).toInt() );
    int size = o.beginReadArray("Rails");
    // proponuję tutaj ustawić liczbę spinboxów na równą size.
    // bo tak to się program wysypie gdy:
    /* zapisze zmiany
       zmienie liczbe spinboxow na mniejsza
       wczytam opcje
       */
    int index;
    for (int i = 0; i < size; i++)
    {//a co jak jest inna liczba spinboxów niż size?
            o.setArrayIndex(i);
            index = _numerZrodlaComboBox[i]->findText(o.value("from", 0).toString());
            if (index != -1)
                _numerZrodlaComboBox[i]->setCurrentIndex(index);
            index = _numerCeluComboBox[i]->findText(o.value("to", 0).toString());
            if (index != -1)
                _numerCeluComboBox[i]->setCurrentIndex(index);
            index = _podlozeZrodlaComboBox[i]->findText(o.value("fromRailBed", 0).toString());
            if (index != -1)
                _podlozeZrodlaComboBox[i]->setCurrentIndex(index);
            index = _podlozeCeluComboBox[i]->findText(o.value("toRailBed", 0).toString());
            if (index != -1)
                _podlozeCeluComboBox[i]->setCurrentIndex(index);
    }
    o.endArray();
}

int TramsPage::getNumRails()
{
    return _iloscTorowSpinBox->value();
}

void TramsPage::setTrackNumber(int i)
{
    //0. jeśli dana linijka nie jest pusta to nie dodaje wcale itemów do niej
    if( (_numerZrodlaComboBox[i]->count() <= 0) && (_numerCeluComboBox[i]->count() <= 0) )
    {
        //1. uzupełniam oba comboBoxy taka ilością Itemów jaka jest liczba gałęzi
        for (int j = 0; j < _numBranches ; j++)
        {
            _numerZrodlaComboBox[i]->addItem(QString::number(double(j)));
            _numerCeluComboBox[i]->addItem(QString::number(double(j)));
        }
    }
    //2. Usuwam niepotrzebne gałęzie (które sa wjazdami/zjazdami) - dotyczy tyylko na jezdni. na trawie mogą być wszystkie
    int size = myParent->getNumBranches();


    int index = 0;
        for (int j = 0; j < size; ++j)
        {
            if (myParent->getBranchDirection(j) == entry)
            {
//                if (_podlozeCeluComboBox[j]->currentText() == "Jezdnia")
                {
                    index = _numerCeluComboBox[i]->findText(QString::number(double(j)));
                    if (index != -1)
                        _numerCeluComboBox[i]->removeItem(index);
                }
            }
            else
            {
//                if (_podlozeCeluComboBox[j]->currentText() == "Jezdnia")
                {
                    index = _numerZrodlaComboBox[i]->findText(QString::number(double(j)));
                    if (index != -1)
                        _numerZrodlaComboBox[i]->removeItem(index);
                }
            }
        }
}

void TramsPage::roadsDirectionChanged(int ind) //w RoadsPage zmienił się kierunek w gałęzi dla numer ind
{
    for (int i = 0; i < _iloscTorowSpinBox->value(); i++)
    {
        int index = _numerZrodlaComboBox[i]->findText(QString::number(double(ind)));
        if (index != -1)//jesli znalazł w zrodle to usun w zrodle, a dodaj w celu
        {
            _numerZrodlaComboBox[i]->removeItem(index);
            _numerCeluComboBox[i]->addItem(QString::number(double(ind)));
        }
        else//jeśli nie znalazł w źródle to szukaj w celu
        {
            index = _numerCeluComboBox[i]->findText(QString::number(double(ind)));
            if (index != -1)
            {
                _numerCeluComboBox[i]->removeItem(index);
                _numerZrodlaComboBox[i]->addItem(QString::number(double(ind)));
            }
        }
    }
}

void TramsPage::groundChanged(int ind)
{
//jeżeli wjazd jest sklejony to nie może być że jest ongrass
    for (int j = 0; j < _iloscTorowSpinBox->value(); j++)
    {
        if ( myParent->getBranchDependence((_numerZrodlaComboBox[j]->itemText(ind)).toInt()) == glued) //czy wybrana gałąż jest sklejona
        {
            int index = _podlozeZrodlaComboBox[j]->findText("Trawa");
            if (index != -1)
                _podlozeZrodlaComboBox[j]->removeItem(index);
        }
        else //jesi nie jest sklejona to sprawdzam, czy jest w liscie "trawa". Jeśli nie ma to ją dodaję
        {
            int index = _podlozeZrodlaComboBox[j]->findText("Trawa");
            if (index == -1)
                _podlozeZrodlaComboBox[j]->addItem("Trawa");
        }
    }
}

RailBed TramsPage::indexToRailBed(QComboBox *box)//sprawdza jaka wartość tekstowa jest pod indeksem i zwraca odpowiednik typu wyliczeniowego
{
    if (box->currentText() == QObject::tr("Trawa"))
        return ongrass;
    else // if (box->currentText() == QObject::tr("Jezdnia"))
        return onroad;
}
